<?php

namespace models;

require_once APPPATH . 'dao/CuponDAO.php';
require_once APPPATH . 'dao/CobradorZonaDAO.php';
require_once APPPATH . 'dao/SocioDAO.php';

/**
 * @Entity
 * @Table(name="`BD_Operativa"".""cupon`")
 */
class M_cupon {

    /**
     * @Id
     * @Column(type="integer", nullable=false)
     */
    private $id;

    /**
     * @Column(type="date", nullable=false)
     */
    private $fecha_vencimiento;

    /**
     * @ManyToOne(targetEntity="M_cobrador", fetch="EAGER")
     * @JoinColumn(name="cobrador_id", referencedColumnName="id")
     */
    private $cobrador;

    /**
     * @ManyToOne(targetEntity="M_socio", fetch="EAGER")
     * @JoinColumn(name="socio_id", referencedColumnName="id")
     */
    private $socio;

    /**
     * @Column(type="boolean", nullable=false)
     */
    private $pagado;

    /**
     * @Column(type="boolean", nullable=false)
     */
    private $devuelto;

    public function getId() {
        return $this->id;
    }

    public function getCobrador() {
        return $this->cobrador;
    }

    public function getSocio() {
        return $this->socio;
    }

    public function getFechaVencimiento() {
        return $this->fecha_vencimiento;
    }

    public function getPagado() {
        return $this->pagado;
    }

    public function getDevuelto() {
        return $this->devuelto;
    }

    public function setCobrador($cobrador) {
        $this->cobrador = $cobrador;
    }

    public function setSocio($socio) {
        $this->socio = $socio;
    }

    public function setFechaVencimiento($fecha_vencimiento) {
        $this->fecha_vencimiento = $fecha_vencimiento;
    }

    public function setPagado($pagado) {
        $this->pagado = $pagado;
    }

    public function setDevuelto($devuelto) {
        $this->devuelto = $devuelto;
    }

    function existe($valor, $campo, $tipo) {

        $dao = new \CuponDAO();

        $cupon = $dao->getCuponBy($valor, $campo, $tipo);

        if ($cupon) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    public function generarCupones($diaActual, $mesActual, $anioActual) {
        //Se instancioa SocioDAO
        $cobradorZonaDAO = new \CobradorZonaDAO();
        //Se invoca un método en SocioDAO para recuperar los socios que cumplan
        //las reglas de filtrado
        $cobradores = $cobradorZonaDAO->getCobradoresYZonas();

        $socioDAO = new \SocioDAO();

        $cuponDAO = new \CuponDAO();

        $fechaVencimiento = date('Y-m-d', mktime(0, 0, 0, $mesActual + 1, $diaActual - 1, $anioActual));
        $mesVencimiento = date('m', mktime(0, 0, 0, $mesActual + 1, $diaActual - 1, $anioActual));
        $anioVencimiento = date('Y', mktime(0, 0, 0, $mesActual + 1, $diaActual - 1, $anioActual));

        foreach ($cobradores as $cobrador) {

            $socios = $socioDAO->getSociosCobrablesEnZona($cobrador->getZona()->getId());

            if (!($socios === FALSE))
                foreach ($socios as $socio) {

                    if (!$cuponDAO->existeCupon($cobrador->getId(), $socio->getId(), $fechaVencimiento, $mesVencimiento, $anioVencimiento)) {

                        $cuponDAO->generarCupon($cobrador->getId(), $socio->getId(), $fechaVencimiento, $mesVencimiento, $anioVencimiento);
                    }
                }
        }
    }

    public function registrarDevolucionCupon($numeroCupon) {

        try {
            $cuponDAO = new \CuponDAO();

            $cupon = $cuponDAO->getCuponByID($numeroCupon);

            $cupon->setDevuelto(TRUE);

            $cuponDAO->em->persist($cupon);

            $cuponDAO->em->flush();


            $alta = TRUE;
        } catch (Exception $e) {
            $alta = FALSE;
            //@TODO no mostrar error
            echo $e->getMessage();
        }

        return $alta;
    }
    
    public function registrarPagoCupon($numeroCupon) {

        try {
            $cuponDAO = new \CuponDAO();

            $cupon = $cuponDAO->getCuponByID($numeroCupon);

            $cupon->setPagado(TRUE);

            $cuponDAO->em->persist($cupon);

            $cuponDAO->em->flush();


            $alta = TRUE;
        } catch (Exception $e) {
            $alta = FALSE;
            //@TODO no mostrar error
            echo $e->getMessage();
        }

        return $alta;
    }

    /**
     * Método encargado de averiguar cuáles cupones fueron pagados,
     * restando a los cupones generados, los cupones devueltos.
     * Luego, los marca como pagados.
     * Retorna true si ha sido realizada la operación satisfactoriamente, false en otro caso.
     * 
     * @return boolean 
     */
    public function registrarPagoCupones() {

        try {
            $cuponDAO = new \CuponDAO();

            $cupones = $cuponDAO->getCuponesNoDevueltos();

            if ($cupones !== FALSE)
                foreach ($cupones as $cupon) {
                    $cupon->setPagado(TRUE);

                    $cuponDAO->em->persist($cupon);
                }

            $cuponDAO->em->flush();


            $alta = TRUE;
        } catch (Exception $e) {
            $alta = FALSE;
        }

        return $alta;
    }
    
    public function getCuponesNoPagados() {

        $cuponDAO = new \CuponDAO();

        return $cuponDAO->getCuponesNoPagados();
    }

}

?>
